/**
 *@file ai.c
 *@brief Arquivo com o módulo de inteligência artificial do Marcos
 *
 *@author Copyright 2009 Marcos
 *\n
 * This program is Free Software, distributed under the
 * terms of the GNU General Public License, published by
 * the Free Software Foundation; version 3 or any later
 * version published by the Free Software Foundation, at
 * your choice.
 */

/**
 *@addtogroup ai
 *@{
 */

static Tile_t matrizaux[25][20];

Bool_t pf_feche;

extern Tile_t mapa[25][20];
extern struct Anima * gato;
extern struct Anima * cozinheiro;
extern Tile_t matrizaux[25][20];


/**
 *@brief Função auxiliar ao módulo de inteligência
 * artificial
 *@param org_x ponto x origem
 *@param org_y ponto y origem
 */
void pathfiding(struct Anima * anima){
/**
 *@{
 */
  int i = anima->x_fake, j = anima->y_fake, x = gato->x_fake, y = gato->y_fake;//coordenadas iniciais
  int k = 0, w = 0;//manipuladores de array locais
  int n_achou = 1, b, aux = 1;//variaveis de controle de loop locais
  int ini = 0, meio = 1, fim = 0, conta = 1;//Variveis de controle de teste locais
  int aux1;
  int aux2, xp, yp;
  struct Posicao_t list[501];//local
  list[fim].x = x, list[fim].y = y;
  fim++;
  meio = fim;
  for(aux1=0; aux1<25; aux1++){
    for(aux2=0; aux2<20; aux2++){
      if(mapa[aux1][aux2]== 17 || mapa[aux1][aux2]== 0){
	matrizaux[aux1][aux2] = 0;
      }
    }
  }
  matrizaux[x][y] = 1;
  while(n_achou){
    aux = 1;
    while(aux){
      for(b=0;b<4;b++){
	switch(b){
	case 0:
	  k = x + 1;
	  w = y;
	  break;
	case 1:
	  k = x;
	  w = y + 1;
	  break;
	case 2:
	  k = x - 1;
	  w = y;
	  break;
	case 3:
	  k = x;
	  w = y - 1;
	  break;
	}
	if((k > 0)&&(w > 0)&&(k < 25)&&(w < 21)){
	if(!(matrizaux[k][w]) && matrizaux[k][w] < conta){
		  matrizaux[k][w] = conta;
		  list[fim].x = k, list[fim].y = w;
		  if(k == i && w == j){
		    n_achou = 0, aux = 0;
		    xp = list[ini].y - anima->y_fake;	//cozinheiro->y_fake;
		      yp = list[ini].x - anima->x_fake;	//cozinheiro->x_fake;
		      if(yp > 0){
			anima->dir = sul;
		      }else if(xp > 0){
			anima->dir = leste;
		      }else if(yp < 0){
			anima->dir = norte;
		      }else{
			anima->dir = oeste;
		      }
		  }
		  fim++;
	  }
	}
      }
      ini++;
      x = list[ini].x;
      y = list[ini].y;
      if(ini == meio){
	aux = 0;
      }
    }
    meio = fim;
    conta++;
  }
/**
 *@}
 */
}

/**
 *@brief gerencia o movimento dos cozinheiros perdidos
 *@details Para usar tente
 *@code
 * pf_thread = SDL_CreateThread(pathfinder_mestre,NULL);
 * @endcode
 * e para finalizar use
 *@code
 * pf_feche = TRUE;
 * SDL_WaitThread(pf_thread,NULL);
 * @endcode
 *@param foo recebe NULL
 *@return Retorna lixo
 */
int pathfinder_mestre(void * foo){
/**
 *@{
 */
  while(!pf_feche){
    struct Anima * aux = primeiro(cozinheiro);
    while(aux != NULL){
      if(aux->dir == indefinido){
	pathfiding(aux);
      }
      aux = proximo(aux);
    }
  }
  pf_feche = FALSE;
/**
 @}
 */
}

/**
 *@}
 */

